const express = require('express');
const app = express();
const port = 3001;
const path = require('path')
const fs = require('fs')
const multiparty = require("multiparty")
const cors = require('cors'); // 安装模块 
app.use(cors()) // 跨域

app.use(express.urlencoded({ //配置
    extended: true
}));
app.use(express.json()) //配置

// 开放资源
app.use(express.static(path.join(__dirname, 'files/')))

// 文件目录读取
function readDir(url, Callback) {
    fs.readdir(url, (err, data) => {
        if (err) {
            return Callback(err)
        }
        Callback(err, data)
    })
}

// 重命名
function rename(arr, name, num = 1) {
    if (!arr.includes(name)) {
        return name
    }
    name = num + name;
    return rename(arr, name, ++num)
}

// 文件目录读取
app.get("/api/file", (req, res) => {
    const { pageNo, pageSize, filename } = req.query;
    readDir(path.join(__dirname, 'files/'), (err, data) => {
        if (err) {
            return res.send(new Error(500))
        }
        // 如果文件数为空 
        if (!data || data.length === 0) {
            return res.send({
                pageNo,
                pageSize,
                total: 0,
                pagesCount: 0,
                files: data || []
            });
        }
        // 是否是搜索
        if (filename) {
            data = data.filter(item => {
                return item.includes(filename);
            })
        }
        const total = data.length;
        // 重哪里开始截取
        let start = (pageNo == 1 ? 0 : (pageNo - 1) * pageSize)
        // 如果截取起始位置大于或等于文件数则返回所以的文件
        if (start >= data.length) {
            start = 0;
        }
        let files = data.splice(start, pageSize);
        // 总页数
        let pagesCount = Math.ceil(data.length / pageSize);
        const lists = {
            pageNo,
            pageSize,
            pagesCount,
            total,
            files: files.map(item => { return { name: item, change: false } })
        }
        res.send(lists)
    })
})

// 上传文件
app.post("/api/file", (req, res) => {
    fs.readdir(path.join(__dirname, "files/"), (err, fileList) => {
        if (err) {
            return res.status(500);
        }

        const from = new multiparty.Form({
            encoding: 'utf-8',
            uploadDir: path.join(__dirname, 'files/') // 指定文件存储目录
        });
        from.on('file', (name, file) => {
            // 文件重命名
            let fname = rename(fileList, file.originalFilename)
            file.originalFilename = fname;
        })

        from.parse(req, (err, fields, files) => {
            let arr = [];
            files.file.forEach(item => {
                fs.renameSync(item.path, from.uploadDir + item.originalFilename);  // 使用fs对文件重命名
                arr.push(item.originalFilename)
            });
            res.status(200).send(arr)
        })
    })
})

// 删除文件
app.delete("/api/file", (req, res) => {
    let psw = req.body.psw;
    let files = req.body.files;
    if (!files || files.length === 0) {
        return res.status(200).send({ code: 400 })
    }
    if (psw !== "123456") {
        return res.status(200).send({ code: 401 })
    }
    let err = false;
    files.forEach(item => {
        fs.unlink(path.join(__dirname, `files/${item}`), (error) => {
            if (error) {
                err = true;
            }
        })
    })
    if (err) {
        return res.status(500).send({ code: 500 })
    }
    res.status(200).send({ code: 200 })
})

app.listen(port, () => {
    console.log(`打开成功 端口号为${port}`);
})